/**
 * 将 Cron 表达式的部分字段转换为中文描述
 * @param field cron 字段值
 * @param unit 单位 (秒, 分, 时, 日, 月)
 * @param anHourOfDay 特殊处理小时，如 "凌晨", "上午"
 */
function parseField(field: string, unit: string, anHourOfDay: boolean = false): string {
  if (field === '*') {
    if (unit === '日' || unit === '月' || unit === '星期') return `每${unit}`;
    return `每${unit}`; // 对于秒、分、时， "每秒/分/时" 已经隐含每单位一次
  }
  if (field.includes(',')) {
    return `在 ${unit} ${field.split(',').join(', ')} 执行`;
  }
  if (field.includes('/')) {
    const parts = field.split('/');
    //简单处理 */X  -> 每X单位
    if (parts[0] === '*') {
      return `每 ${parts[1]} ${unit}`;
    }
    return `从 ${parts[0]} 开始每 ${parts[1]} ${unit}`;
  }
  if (field.includes('-')) {
    const parts = field.split('-');
    return `从 ${parts[0]} 到 ${parts[1]} ${unit}`;
  }
  // Specific value
  let value = parseInt(field, 10);
  if (anHourOfDay) {
    if (value >= 0 && value < 6) return `凌晨 ${value} 点`;
    if (value >= 6 && value < 12) return `上午 ${value} 点`;
    if (value === 12) return `中午 12 点`;
    if (value > 12 && value < 18) return `下午 ${value - 12} 点`;
    if (value >= 18 && value < 24) return `晚上 ${value - 12} 点`;
  }
  return `${value} ${unit}`;
}

function getDayOfWeekName(dayNum: string): string {
  const names = ['日', '一', '二', '三', '四', '五', '六'];
  if (dayNum === '*' || dayNum === '?') return '每一天';
  
  let result = '';
  if (dayNum.includes(',')) {
    result = dayNum.split(',').map(d => `星期${names[parseInt(d, 10)] || d}`).join('、');
  } else if (dayNum.includes('-')) {
    const parts = dayNum.split('-');
    result = `星期${names[parseInt(parts[0], 10)] || parts[0]}到星期${names[parseInt(parts[1], 10)] || parts[1]}`;
  } else if (dayNum.includes('/')) {
      const parts = dayNum.split('/');
      if (parts[0] === '*') {
          return `每${parts[1]}天 (星期)`;
      }
      result = `从星期${names[parseInt(parts[0], 10)] || parts[0]}开始，每${parts[1]}天`;
  } else {
    result = `星期${names[parseInt(dayNum, 10)] || dayNum}`;
  }
  return result;
}


export function parseCronToHumanReadable(cronExpression: string): string {
  if (!cronExpression || typeof cronExpression !== 'string') {
    return '无效规则';
  }

  const parts = cronExpression.trim().split(/\s+/);
  if (parts.length < 5 || parts.length > 7) {
    console.warn('Cron expression has an unsupported number of parts:', cronExpression);
    return cronExpression; // 返回原始表达式如果格式不标准
  }

  // 假设格式为：秒 分 时 日 月 星期 [年]
  // 我们主要处理前6个部分
  const s = parts.length > 5 ? parts[0] : '0'; // 如果是5段式，秒默认为0
  const m = parts.length > 5 ? parts[1] : parts[0];
  const h = parts.length > 5 ? parts[2] : parts[1];
  const dom = parts.length > 5 ? parts[3] : parts[2]; // Day of Month
  const mon = parts.length > 5 ? parts[4] : parts[3]; // Month
  const dow = parts.length > 5 ? parts[5] : parts[4]; // Day of Week

  let description = '';

  // 1. 处理时间和日期组合的常见情况
  // 每天固定时间执行: X X X * * *
  if (dom === '*' && mon === '*' && (dow === '*' || dow === '?')) {
    description = '每天 ';
    if (h === '*' && m === '*' && s === '0') { // 每分钟的0秒
        description += '每分钟';
    } else if (h === '*' && s === '0') { // 每小时的X分0秒
        description += `每小时的 ${parseField(m, '分')} `;
    } else {
        description += `${parseField(h, '点', true)}${parseField(m, '分')}`;
        if (s !== '0' && s !== '*') { // 只有当秒不是0或*时才显示秒
            description += `${parseField(s, '秒')}`;
        }
    }
    description += ' 执行';
    return description.trim();
  }

  // 2. 每月特定日期和时间: X X X D M *
  if (dow === '*' || dow === '?') { // dow 不重要
    description = `每月 ${parseField(dom, '日')} `;
    description += `${parseField(h, '点', true)}${parseField(m, '分')}`;
    if (s !== '0' && s !== '*') description += `${parseField(s, '秒')}`;
    if (mon !== '*') {
      description = `${parseField(mon, '月')} ${parseField(dom, '日')} ` + description.substring(description.indexOf(parseField(h,'点', true)));
    }
    description += ' 执行';
    return description.trim();
  }
  
  // 3. 每周特定星期和时间: X X X ? M DOW or X X X * M DOW
  if (dom === '?' || dom === '*') { // dom 不重要
    description = `每周的 ${getDayOfWeekName(dow)} `;
    description += `${parseField(h, '点', true)}${parseField(m, '分')}`;
    if (s !== '0' && s !== '*') description += `${parseField(s, '秒')}`;
    if (mon !== '*') {
      description = `在 ${parseField(mon, '月')}的每周 ${getDayOfWeekName(dow)} ` + description.substring(description.indexOf(parseField(h,'点', true)));
    }
    description += ' 执行';
    return description.trim();
  }

  // 4. 更复杂的或不太常见的模式，可以返回一个组合描述或原始表达式
  // 这是一个非常简化的解析器，可以根据需要扩展
  // 例如：0 0 12 1,15 * *  -> 每月1日和15日的中午12点执行
  let timeDesc = `${parseField(h, '点', true)}${parseField(m, '分')}`;
  if (s !== '0' && s !== '*') timeDesc += `${parseField(s, '秒')}`;
  
  let dateDesc = '';
  if (mon !== '*') dateDesc += `${parseField(mon, '月')} `;
  if (dom !== '*' && dom !== '?') dateDesc += `${parseField(dom, '日')} `;
  if (dow !== '*' && dow !== '?') dateDesc += `${getDayOfWeekName(dow)} `;

  if (dateDesc) {
    return `在 ${dateDesc.trim()} 的 ${timeDesc} 执行`;
  }
  
  // 如果以上模式都不匹配，尝试逐字段解释（可能不那么自然）
  // 或者直接返回原始的，表示无法简单解析
  // Fallback for complex patterns not explicitly handled above
  let fallbackDesc = [];
  if (s !== '0' && s !== '*') fallbackDesc.push(parseField(s, '秒')); // Only show seconds if specific
  fallbackDesc.push(parseField(m, '分'));
  fallbackDesc.push(parseField(h, '时'));
  if (dom !== '*' && dom !== '?') fallbackDesc.push(`在 ${parseField(dom, '日')}`);
  if (mon !== '*') fallbackDesc.push(`在 ${parseField(mon, '月')}`);
  if (dow !== '*' && dow !== '?') fallbackDesc.push(`在 ${getDayOfWeekName(dow)}`);
  
  if (fallbackDesc.length > 0) {
      return fallbackDesc.join(' ') + ' 执行';
  }

  console.warn('Cron expression could not be simply translated:', cronExpression);
  return cronExpression; // Fallback to original
} 